package com.mephi.oshs.view.elements;

import com.mephi.oshs.model.entry.IEntry;
import com.mephi.oshs.model.tree.OshsTree;
import org.eclipse.swt.widgets.EntryTreeItem;
import org.eclipse.swt.widgets.Listener;

import java.util.List;

/**
 * Элемент отвечающий за отображение дерева ОШС.
 */
public interface IOshsTreeWidget<T extends IEntry> {

    /**
     * Обновить отображение всех узлов дерева, хранящих данный элемент.
     *
     * @param updatedEntry Элемент хранящийся в узлах дерева.
     */
    public void update(final T updatedEntry);

    /**
     * Отобразить заново дерево ОШС.
     *
     * @param oshsTree Дерево ОШС.
     */
    public void setTree(final OshsTree<T> oshsTree);

    /**
     * Получить все узлы дерева хранящие в себе заданный элемент.
     *
     * @param searchEntry Элемент хранящийся в узлах дерева.
     * @return Список узлов отображающих данные дерева ОШС.
     */
    public List<EntryTreeItem<T>> findEntries(final T searchEntry);

    /**
     * Выделить узел содержащий в себе элемент дерева ОШС.
     * На случай, если таких узлов несколько - указывается порядковый индекс нужного узла.
     *
     * @param entry Элемент хранящийся в узлах дерева.
     * @param index Порядковый номер узла.
     * @return False - в случае если нет узла с нужным индексом, либо заданного элемента нет ни в одном из узлов.
     */
    public boolean selectEntry(final T entry, final int index);

    /**
     * Добавить слушателя на событие: выбор пользователем одного из узлов дерева.
     *
     * @param listener Слушатель.
     */
    public void addSelectListener(final Listener listener);

    /**
     * Снять выделение со всех узлов дерева.
     */
    public void deselectAll();
}
